package org.wzh.spring.di.demoq;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.beans.factory.annotation.Qualifier;

/**
 * 面向特性的限定符要比基于bean ID的限定符更好一些.但是,如果多个bean都具备相同特性的话,这种做法也会出现问题.
 * 而且Java不允许在同一个条目上重复出现相同类型的多个注解.如果你试图这样做的话,编译器会提示错误.
 * 
 * 我们可以创建自定义的限定符注解,借助这样的注解来表达bean所希望限定的特性.
 * 这里所需要做的就是创建一个注解,它本身要使用@Qualifier注解来标注.这样我们将不再使用@Qualifier("cold"),而是使用
 * 自定义的@Cold注解.
 * 
 * Java8允许出现重复的注解,只要这个注解本身在定义的时候带有@Repeatable注解就可以.不过,Spring的@Qualifier注解
 * 并没有在定义时添加@Repeatable注解.
 * 
 * 通过声明自定义的限定符注解,我们可以同时使用多个限定符,不会再有Java编译器的限制或错误.
 * 与此同时,相对于使用原始的@Qualifier并借助String类型来指定限定符,自定义的注解也更为类型安全.
 * @author MicroCat
 *
 */
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold {

}
